package java基础知识.集合.map;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * @author coderFu
 * @create 2022/3/10
 *
 * hashMap
 */
public class CoderHashMap {

    public static void main(String[] args) {


        // 默认的负载因子 是0.75 ，
        // 是jdk开发人员 从所占资源和查询效率进行了权衡测试的出来的


        // hashMap的put操作


        HashMap<String, String> hashMap = new HashMap<>(15);


        // 计算key的方式 (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);

        // 扰动函数， hashCode值 异或它的高16位 防止hash 冲突

        // 首先检查 桶数组是否为空， 如果桶数组为空或者没有初始化容量 进行容量的初始化
        //p = tab[i = (n - 1) & hash]) == null,确定在桶数组中的位置 是否有冲突
        // 如果没有冲突： 直接存储在当前位置  存储了hash值，key ，value

        // 如果有冲突： 此时就要比较 当前的key值是否相同，如果相同那就替换，并返回之前的值

        // 如果当前的key值不等于当前的值，就需要判断桶连接的数据结构是什么
        // 是链表还是红黑树：  如果是红黑树继续调用红黑树的添加元素的方法
        // 如果是链表：就循环链表，判断下一个链表是不是null，如果是就直接插到最后
        // 如果不是 ： 那就判断是否key相同，如果相同就替换 返回之前的值
        // 一直循环直到知道为空的值 插入到后面，插入后判断是否需要替换成红黑树
        // 替换原则： 链表长度 8 桶的容量大于64

        // 数据插入完成之后，判断是否大于当前的承载容量，如果大于就要扩容，不大于就不用扩容


        hashMap.put("123","a");
        // 一张表最多建立 16 个索引
        int a  = 10;
        a = a << 1 ;
        System.out.println(a);
        a = a >> 1;
        System.out.println(a);

        String s = hashMap.get("123");
        System.out.println(s);
        Set<Map.Entry<String, String>> entries = hashMap.entrySet();

        Set<String> set = hashMap.keySet();


    }
}
